package san.java.methods_06;

import com.sun.scenario.effect.impl.sw.java.JSWColorAdjustPeer;

/**
 * 方法:
 *  方法的参数调用:
 *      形参和实参:
 *          java里方法的参数传递只有一种 -> 值传递(传递的是变量在栈内存中的值)
 *             1. 对于基本数据类型来说, 就是把实参的值复制到形参上
 *             2. 对于引用类型来说, 传递的是对象在堆内存中对应的地址
 *              i.   DataSwap dataSwap = new DataSwap(0);  新建了一个对象,并保存在了堆内存中,地址为BE2500
 *              ii.  dataSwap存在栈中, 地址为AD9500, 值是BE2500
 *              iii. 传递的值即为BE2500
 *
 *      可变个数参数的传递的两种方法:
 *          1. 使用数组的方式进行可变个数参数传递  String[] args
 *          2. 使用java特有语法...进行参数传递   String... args
 *              i  没有参数可以不填
 *              ii 可以直接传递参数,不用传递数组
 *          3. 可变参数必须放在参数列表的最后  public void printInfo(int, String... args)
 */

public class methods {

    public static class DataSwap {
        int a;

        public DataSwap(int a) {
            this.a = a;
        }
    }

    public static void swap(int i) {
        i = 6;
        System.out.println(i);
    }

    public static void swap(DataSwap ds) {
        ds.a = 10;
        System.out.println("swap方法里, a Field的值是: " + ds.a);
    }

    public static void main(String[] args) {

        /**
         * java中的参数传递都是值传递
         *  1. 对于基本数据类型来说, 就是把实参的值复制到形参上
         *  2. 对于引用类型来说, 传递的是对象的地址
         */
        int a = 0;
        swap(a);
        System.out.println("a: " + a);

        DataSwap dataSwap = new DataSwap(0);
        swap(dataSwap);
        System.out.println("main方法里, a Field的值是: " + dataSwap.a);



        /**
         * 可变参数传递
         */
        Person p1 = new Person();
        String[] ags = new String[]{
                "san",
                "26",
                "male"
        };

        // String[] args的方式
        p1.printInfo(ags);
//        p1.printInfo("san", "26", "male");  // 可以看到String[] args的方式不支持这样传递参数
//        p1.printInfo();  // 不支持一个参数都不写

        // String... args 的方式支持这种传参方式
        p1.printInfo1("san", "26", "male");
        p1.printInfo1();  // 支持不传递参数
    }
}
